


package jnpf.htgl.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jnpf.base.ActionResult;
import jnpf.base.UserInfo;
import jnpf.base.entity.VisualdevEntity;
import jnpf.base.vo.PageListVO;
import jnpf.base.vo.PaginationVO;
import jnpf.engine.entity.FlowTaskEntity;
import jnpf.engine.enums.FlowStatusEnum;
import jnpf.exception.DataException;
import jnpf.exception.WorkFlowException;
import jnpf.htgl.entity.ZcglHtglInfoChangeEntity;
import jnpf.htgl.entity.ZcglHtglInfoEntity;
import jnpf.htgl.mapper.ZcglHtglInfoMapper;
import jnpf.htgl.model.zcglhtglinfochange.ZcglHtglInfoChangeForm;
import jnpf.htgl.model.zcglhtglinfochange.ZcglHtglInfoChangeInfoVO;
import jnpf.htgl.model.zcglhtglinfochange.ZcglHtglInfoChangeListVO;
import jnpf.htgl.model.zcglhtglinfochange.ZcglHtglInfoChangePagination;
import jnpf.htgl.service.ZcglHtglInfoChangeService;
import jnpf.permission.entity.UserEntity;
import jnpf.util.GeneraterSwapUtil;
import jnpf.util.JsonUtil;
import jnpf.util.RandomUtil;
import jnpf.util.UserProvider;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import java.util.Map;


/**
 * 合同变更
 *
 * @版本： V3.2.0
 * @版权： 智果云科技（https://www.jnpfsoft.com）
 * @作者： JNPF开发平台组
 * @日期： 2025-01-26
 */
@Slf4j
@RestController
@Api(tags = "合同变更", value = "example")
@RequestMapping("/api/example/ZcglHtglInfoChange")
public class ZcglHtglInfoChangeController {

    @Autowired
    private GeneraterSwapUtil generaterSwapUtil;


    @Autowired
    private UserProvider userProvider;

    @Autowired
    private ZcglHtglInfoChangeService zcglHtglInfoChangeService;

    @Autowired
    private ZcglHtglInfoMapper zcglHtglInfoMapper;


    /**
     * 列表
     *
     * @param zcglHtglInfoChangePagination
     * @return
     */
    @ApiOperation("获取列表")
    @PostMapping("/getList")
    public ActionResult list(@RequestBody ZcglHtglInfoChangePagination zcglHtglInfoChangePagination) throws IOException {
        List<ZcglHtglInfoChangeEntity> list = zcglHtglInfoChangeService.getList(zcglHtglInfoChangePagination);
        //处理id字段转名称，若无需转或者为空可删除
        List<ZcglHtglInfoChangeListVO> listVO = JsonUtil.getJsonToList(list, ZcglHtglInfoChangeListVO.class);
        for (ZcglHtglInfoChangeListVO zcglHtglInfoChangeVO : listVO) {

            //根据合同id获取合同信息
            ZcglHtglInfoEntity zcglHtglInfoEntity = zcglHtglInfoMapper.selectById(zcglHtglInfoChangeVO.getHtdgid());
            zcglHtglInfoChangeVO.setContractNumber(zcglHtglInfoEntity.getContractNumber());

            zcglHtglInfoChangeVO.setHtdgid_name(zcglHtglInfoChangeVO.getHtdgid());

            zcglHtglInfoChangeVO.setRemarks_name(zcglHtglInfoChangeVO.getRemarks());

            zcglHtglInfoChangeVO.setType_name(zcglHtglInfoChangeVO.getType());

            zcglHtglInfoChangeVO.setContractNumber_name(zcglHtglInfoChangeVO.getContractNumber());

            //子表数据转换
        }

        for (ZcglHtglInfoChangeListVO vo : listVO) {
            FlowTaskEntity flowTaskEntity = generaterSwapUtil.getInfoSubmit(vo.getId(), FlowTaskEntity::getStatus);
            if (flowTaskEntity != null) {
                vo.setFlowState(flowTaskEntity.getStatus());
            } else {
                vo.setFlowState(null);
            }
        }
        PageListVO vo = new PageListVO();
        vo.setList(listVO);
        PaginationVO page = JsonUtil.getJsonToBean(zcglHtglInfoChangePagination, PaginationVO.class);
        vo.setPagination(page);
        return ActionResult.success(vo);

    }

    /**
     * 创建
     *
     * @param crData
     * @return
     */
    @PostMapping
    @Transactional
    @ApiOperation("创建")
    public ActionResult create(@RequestBody Map<String, Object> crData) throws DataException {
        ZcglHtglInfoChangeForm zcglHtglInfoChangeForm = JsonUtil.getJsonToBean(crData, ZcglHtglInfoChangeForm.class);
        boolean b = zcglHtglInfoChangeService.checkForm(zcglHtglInfoChangeForm, 0);
        if (b) {
            return ActionResult.fail("单行输入不能重复");
        }
        String visualId = "653196191437181509";

        if(zcglHtglInfoChangeForm.getType().equals("2")){
            visualId ="643082324031848006";
        }
        if(zcglHtglInfoChangeForm.getType().equals("3")){
            visualId ="643082324031848005";
        }
        //合同中止
        if(zcglHtglInfoChangeForm.getType().equals("4")){
            visualId ="643082324031848010";
        }


        VisualdevEntity visualdevEntity = generaterSwapUtil.getVisualEntity(visualId);
        String mainId = RandomUtil.uuId();

        UserInfo userInfo = userProvider.get();
        UserEntity userEntity = generaterSwapUtil.getUser(userInfo.getUserId());
        ZcglHtglInfoChangeEntity entity = JsonUtil.getJsonToBean(zcglHtglInfoChangeForm, ZcglHtglInfoChangeEntity.class);
        entity.setId(mainId);
        zcglHtglInfoChangeService.save(entity);

        if (FlowStatusEnum.submit.getMessage().equals(zcglHtglInfoChangeForm.getStatus())) {
            try {
                generaterSwapUtil.submitFlowTask(visualdevEntity, mainId, zcglHtglInfoChangeForm, userInfo, zcglHtglInfoChangeForm.getCandidateList(), zcglHtglInfoChangeForm.getFlowUrgent());
            } catch (WorkFlowException e) {
                e.printStackTrace();
            }
            return ActionResult.success("提交成功，请耐心等待");
        }
        return ActionResult.success("保存成功");
    }


    /**
     * 信息
     *
     * @param id
     * @return
     */
    @ApiOperation("信息")
    @GetMapping("/{id}")
    public ActionResult<ZcglHtglInfoChangeInfoVO> info(@PathVariable("id") String id) {
        ZcglHtglInfoChangeEntity entity = zcglHtglInfoChangeService.getInfo(id);
        ZcglHtglInfoChangeInfoVO vo = JsonUtil.getJsonToBean(entity, ZcglHtglInfoChangeInfoVO.class);

        //子表
        //副表
        return ActionResult.success(vo);
    }


    /**
     * 更新
     *
     * @param id
     * @param upData
     * @return
     */
    @PutMapping("/{id}")
    @Transactional
    @ApiOperation("更新")
    public ActionResult update(@PathVariable("id") String id, @RequestBody @Valid Map<String, Object> upData) throws DataException {
        ZcglHtglInfoChangeForm zcglHtglInfoChangeForm = JsonUtil.getJsonToBean(upData, ZcglHtglInfoChangeForm.class);
        boolean b = zcglHtglInfoChangeService.checkForm(zcglHtglInfoChangeForm, 1);
        if (b) {
            return ActionResult.fail("单行输入不能重复");
        }
        String visualId = "653196191437181509";
        VisualdevEntity visualdevEntity = generaterSwapUtil.getVisualEntity(visualId);
        UserInfo userInfo = userProvider.get();
        ZcglHtglInfoChangeEntity entity = zcglHtglInfoChangeService.getInfo(id);
        if (entity != null) {
            ZcglHtglInfoChangeEntity subentity = JsonUtil.getJsonToBean(zcglHtglInfoChangeForm, ZcglHtglInfoChangeEntity.class);
            boolean b1 = zcglHtglInfoChangeService.updateById(subentity);
            if (!b1) {
                return ActionResult.fail("当前表单原数据已被调整，请重新进入该页面编辑并提交数据");
            }
            if (FlowStatusEnum.submit.getMessage().equals(zcglHtglInfoChangeForm.getStatus())) {
                try {
                    generaterSwapUtil.submitFlowTask(visualdevEntity, id, subentity, userInfo, zcglHtglInfoChangeForm.getCandidateList(), zcglHtglInfoChangeForm.getFlowUrgent());
                } catch (WorkFlowException e) {
                    e.printStackTrace();
                }
                return ActionResult.success("提交成功，请耐心等待");
            }
            return ActionResult.success("更新成功");
        } else {
            return ActionResult.fail("更新失败，数据不存在");
        }
    }

    /**
     * 删除
     *
     * @param id
     * @return
     */
    @ApiOperation("删除")
    @DeleteMapping("/{id}")
    @Transactional
    public ActionResult delete(@PathVariable("id") String id) {
        ZcglHtglInfoChangeEntity entity = zcglHtglInfoChangeService.getInfo(id);
        if (entity != null) {
            FlowTaskEntity taskEntity = generaterSwapUtil.getInfoSubmit(id, FlowTaskEntity::getId, FlowTaskEntity::getStatus);
            if (taskEntity != null) {
                try {
                    generaterSwapUtil.deleteFlowTask(taskEntity);
                } catch (WorkFlowException e) {
                    e.printStackTrace();
                }
            }
            zcglHtglInfoChangeService.delete(entity);

        }
        return ActionResult.success("删除成功");
    }


}
